package util;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;
import org.springframework.stereotype.Component;

/**
 * @author 刘秋荣
 * @publish 2015-10-27 下午2:28:03
 * @category Hibernate工具类
 */
@Component
public class HibernateUtil {
	@Resource(name="sessionFactory")
	private SessionFactory factory;
	
	/**
	 * @return 获取会话
	 */
	public Session getSession(){
		return factory.openSession();
	}
	
	/**
	 * @param obj
	 * @return 添加数据 返回可序列的对象，即（表的主键值）
	 */
	public Serializable save(Object obj){
		Serializable resu=null;
		Session session=getSession();
		Transaction tran=session.beginTransaction();
		try{
			resu=session.save(obj);
			tran.commit();//提交事务
		}catch(Exception e){
			e.printStackTrace();
			tran.rollback();
		}finally{
			session.close();
		}
		return resu;
	}
	
	/**
	 * @param obj
	 * @return 数据更新
	 */
	public boolean update(Object obj){
		boolean isok=false;
		Session session=getSession();
		Transaction tran=session.beginTransaction();
		try{
			session.update(obj);
			tran.commit();//提交事务
			isok=true;//表示成功
		}catch(Exception e){
			e.printStackTrace();
			tran.rollback();
		}finally{
			session.close();
		}
		return isok;
	}
	
	/**
	 * @param cla
	 * @param id
	 * @return 数据删除
	 */
	public boolean delete(Class cla, Serializable id){
		boolean isok=false;
		Session session=getSession();
		Transaction tran=session.beginTransaction();
		try{
			Object obj=session.get(cla,id);//根据类型和主键获取数据
			session.delete(obj);//删除数据
			tran.commit();//提交事务
			isok=true;//表示成功
		}catch(Exception e){
			e.printStackTrace();
			tran.rollback();
		}finally{
			session.close();
		}
		return isok;
	}
	
	/**
	 * @param cla
	 * @param id
	 * @return 根据主键ID查询一条数据
	 */
	public Object get(Class cla, Serializable id){
		Object obj=null;
		Session session=getSession();
		try{
			obj=session.get(cla,id);//根据类型和主键获取数据
//			System.out.println(session.load(cla,id));
//			System.out.println(obj);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			session.close();
		}
		return obj;
	}
	
	/**
	 * 更新指定列
	 * @param hql
	 * @param pras
	 * @return
	 */
	public boolean updateColumn(String hql,Object...pras){
		int resu=0;
		Session session=getSession();
		Transaction tran=session.beginTransaction();
		try{
			Query query=session.createQuery(hql);
			for(int i=0;i<pras.length;i++){
				query.setString(i, pras[i].toString());
			}
			resu=query.executeUpdate();
			tran.commit();
		}catch(Exception e){
			e.printStackTrace();
			tran.rollback();
		}finally{
			session.close();
		}
		return resu>0;
	}
	
	/**
	 * @param hql 语句
	 * @param pras 参数
	 * @return 查询多条数据
	 */
	public List queryByHql(String hql,boolean isCache,Object...pras){
		List list=new ArrayList();
		Session session=getSession();
		try{
			Query query=session.createQuery(hql);
			query.setCacheable(isCache);//设置是否缓存数据
			for(int i=0;i<pras.length;i++){
				query.setString(i, pras[i].toString());//为参数传参
			}
			list=query.list();//查询结果
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			session.close();
		}
		return list;
	}
	
	/**
	 * @param hql 语句
	 * @param page 当前页数
	 * @param rows 一页显示的记录数
	 * @param pras 参数
	 * @return
	 */
	public List queryHqlByPage(String hql,boolean isCache,int page,int rows,Object...pras){
		List list=new ArrayList();
		Session session=getSession();
		try{
			Query query=session.createQuery(hql);
			query.setCacheable(isCache);
			for(int i=0;i<pras.length;i++){
				query.setString(i, pras[i].toString());//为参数传参
			}
			query.setFirstResult((page-1)*rows);//分页开始的记录序号
			query.setMaxResults(rows);//分页获取的数据数量
			list=query.list();//查询结果
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			session.close();
		}
		return list;
	}
	
	/**
	 * @param hql
	 * @param pras
	 * @return 查询一行一列的数据
	 */
	public Object getObjectByHql(String hql,Object...pras){
		Object obj=null;
		Session session=getSession();
		try{
			Query query=session.createQuery(hql);
			for(int i=0;i<pras.length;i++){
				query.setString(i, pras[i].toString());//为参数传参
			}
			obj=query.iterate().next();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			session.close();
		}
		return obj;
	}
	/**
	 * @param sql
	 * @param pras
	 * @return 使用标准SQL语句查询
	 */
	public List queryBySql(String sql,Object...pras){
		List list=new ArrayList();
		Session session=getSession();
		try{
			SQLQuery query= session.createSQLQuery(sql);
			for(int i=0;i<pras.length;i++){
				query.setString(i, pras[i].toString());//为参数传参
			}
			list=query.list();//查询结果
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			session.close();
		}
		return list;
	}
}